/**
 * target: based on the existing contingent ff plan solver, 
 * convert its plan result(string as follows) into a plan class. 
```
    ff: found plan as follows
    -------------------------------------------------
    0||0 --- MOVE-TO R1 PS P2 --- SON: 1||0
    -------------------------------------------------
    1||0 --- SENSE-BLOCK-AT R1 B1 P2 --- TRUESON: 2||0 --- FALSESON: 2||1
    -------------------------------------------------
    2||0 --- PICKUP R1 B1 P2 --- SON: 3||0
    2||1 --- MOVE-TO R1 P2 P1 --- SON: 3||1
    -------------------------------------------------
    3||0 --- MOVE-TO R1 P2 PG --- SON: 4||0
    3||1 --- PICKUP R1 B1 P1 --- SON: 4||1
    -------------------------------------------------
    4||0 --- PLACE R1 B1 PG --- SON: 5||-1
    4||1 --- MOVE-TO R1 P1 PG --- SON: 5||0
    -------------------------------------------------
    5||0 --- PLACE R1 B1 PG --- SON: 6||-1
    -------------------------------------------------
```
*/

#ifndef __CONT_FF_PLAN_SOLVER_HPP__
#define __CONT_FF_PLAN_SOLVER_HPP__

#include "contbtsys_core/ContPlanSolverBase.hpp"

namespace ContBTSys {
    class ContFFPlanSolver : public ContPlannerBase {
    public:
        ContFFPlanSolver() {}
        virtual ~ContFFPlanSolver() {}

        /**
         * @brief Use contingent-ff planner to get a plan, and convert it into a plan tree.
         * @param domain The path of domain file
         * @param problem The path of problem file
         * @param node_namespace The namespace of the node, default is ""
        */
        RootPtr getPlan(
            const std::string & domain, const std::string & problem,
            const std::string & node_namespace = "");
    };
}

#endif // __CONT_FF_PLAN_SOLVER_HPP__